import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';
import * as session from 'express-session';
import { Logger } from 'common/lib/utils/log4js';
import * as Chalk from 'chalk';

//引入
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { HttpExceptionFilter } from 'common/lib/filters/http-exception.filter';
//引入日志中间件
import { logger } from 'common/lib/middleware/logger/logger.middleware';
import { TransformInterceptor } from 'common/lib/interceptor/transform/transform.interceptor';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const config = app.get(ConfigService);
  const port = config.get('basic.port');
  const tport = config.get('basic.tport');

  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.TCP,
    options: {
      port: tport,
    },
  });

  app.setGlobalPrefix('basic');

  // 监听所有的请求路由，并打印日志
  app.use(logger);

  //全局使用拦截器
  app.useGlobalInterceptors(new TransformInterceptor());

  // 过滤处理http异常
  app.useGlobalFilters(new HttpExceptionFilter());

  //配置swagger
  const swaggerOptions = new DocumentBuilder()
    .setTitle('basic-api-文档') //文档标题
    .setDescription('basic-api-说明') //文档描述
    .setVersion('1.0') //文档版本
    .addBasicAuth() //鉴权，可以输入token
    .build(); //创建

  //创建swagger
  const document = SwaggerModule.createDocument(app, swaggerOptions);
  //启动swagger
  SwaggerModule.setup('basic', app, document); // 访问路径为 localhost:port/basic

  //配置session
  app.use(
    session({
      name: 'c.sid', // 返回客户端的 key 的名称，默认为 connect.sid,也可以自己设置
      secret: 'dmyxs', // 密钥，一个 String 类型的字符串，作为服务器端生成 session 的签名
      resave: false, // 强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false
      saveUninitialized: true, // 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时，它就处于未初始化状态。在设定一个cookie前，这对于登陆验证，减轻服务端存储压力，权限控制是有帮助的。（默 认：true）。
      cookie: { maxAge: 1000 * 60 * 60 * 24 }, // cookie配置，设置返回到前端 key 的属性，默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
      rolling: true, // 在每次请求时强行设置 cookie，重置 cookie 过期时间（默认：false）
    }),
  );

  app.enableCors(); //开启跨域访问

  await app.startAllMicroservices();
  await app.listen(port);
  Logger.log(
    Chalk.green(`basic 服务启动成功 `),
    '\n',
    Chalk.yellow(`http://localhost:${port}/`),
  );

}
bootstrap();
